package com.gzy.cs5.service;

import com.gzy.cs5.data.ItemData;
import com.gzy.cs5.exception.BusinessException;
import com.gzy.cs5.exception.ErrorCode;
import com.gzy.cs5.model.Item;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 库存管理类，负责管理商品的库存信息。
 * 提供查找商品、更新商品和检查库存的方法。
 */
public class InventoryManager {
    /**
     * 存储商品的库存信息，键为商品ID，值为商品对象。
     */
    private Map<String, Item> inventory;

    /**
     * 构造函数，初始化库存管理器。
     * 使用样本商品数据初始化库存。
     */
    public InventoryManager() {
        this.inventory = new HashMap<>(ItemData.getSampleItems());
    }

    /**
     * 根据商品ID查找商品。
     *
     * @param itemId 商品ID
     * @return 找到的商品对象，如果未找到则返回null
     */
    public Item findItemById(String itemId) {
        return inventory.get(itemId);
    }

    /**
     * 更新商品信息。
     * 如果商品或商品ID为null，则抛出IllegalArgumentException。
     *
     * @param item 要更新的商品对象
     * @throws IllegalArgumentException 如果商品或商品ID为null
     */
    public void updateItem(Item item) {
        if (item == null || item.getItemId() == null) {
            throw new IllegalArgumentException("Item or item ID cannot be null");
        }
        inventory.put(item.getItemId(), item);
    }

    /**
     * 检查订单中的商品库存。
     * 如果商品不存在或库存不足，则抛出BusinessException。
     *
     * @param items 订单中的商品列表
     * @throws BusinessException 如果商品不存在或库存不足
     */
    public void checkStock(List<Item> items) throws BusinessException {
        for (Item item : items) {
            Item existingItem = findItemById(item.getItemId());
            if (existingItem == null || existingItem.getStock() < 1) {
                throw new BusinessException(ErrorCode.ITEM_OUT_OF_STOCK, item.getName());
            }
            existingItem.setStock(existingItem.getStock() - 1);
            updateItem(existingItem);
        }
    }
}
